package tinyGA;

import tinyGA.ObjTipo;


import java.util.Map;
import java.util.HashMap;

public class TS {

	private Map<String, ObjTipo> tablaTipo;
	private Map<String, Integer> tablaDir;
	private Map<String,Integer> nivel;
	private Map<String,Integer> inicio;
	//private Map<String,ObjTipo> tipo;

	public TS() {
		tablaDir = new HashMap<String, Integer>();
		tablaTipo = new HashMap<String, ObjTipo>();
		
		nivel = new HashMap<String, Integer>();
		inicio = new HashMap<String, Integer>();
		//tipo = new HashMap<String, ObjTipo>();
		
	}
	
	/*private TS(Map<String, ObjTipo> tTipo, Map<String, Integer> tDir) {
		this.tablaDir = tDir;
		this.tablaTipo = tTipo;
	}*/

	private TS(Map<String, ObjTipo> tTipo, Map<String, Integer> tDir, Map<String, Integer> niv, Map<String, Integer> ini){//, Map<String, ObjTipo> tip) {
		this.tablaDir = tDir;
		this.tablaTipo = tTipo;
		
		this.nivel = niv;
		this.inicio = ini;
		//this.tipo = tip;
	}

	/*public TS aniadeLex(String lex, ObjTipo tipo, Integer dir) {
		TS tSimb = new TS(new HashMap<String, ObjTipo>(tablaTipo),
				new HashMap<String, Integer>(tablaDir));
		tSimb.tablaDir.put(lex, dir);
		tSimb.tablaTipo.put(lex, tipo);
		return tSimb;
	}*/
	
	//Nuevo acondicionado
	public TS aniadeLex(String lex, ObjTipo elem, Integer dir, Integer niv, Integer ini){//, ObjTipo t) {
		TS tSimb = new TS(new HashMap<String, ObjTipo>(tablaTipo),
				new HashMap<String, Integer>(tablaDir),
				new HashMap<String, Integer>(nivel),
				new HashMap<String, Integer>(inicio)
				//,new HashMap<String, ObjTipo>(tipo)
				);
		tSimb.tablaDir.put(lex, dir);
		tSimb.tablaTipo.put(lex, elem);
		tSimb.nivel.put(lex, niv);
		tSimb.inicio.put(lex, ini);
		//tSimb.tipo.put(lex, t);
		return tSimb;
	}

	//adaptado
	public TS borraLex(String lex) {
		/*
		 * TS tSimb = new TS(new HashMap<String, ObjTipo>(tablaTipo),
				new HashMap<String, Integer>(tablaDir));
		*/
		TS tSimb = new TS(new HashMap<String, ObjTipo>(tablaTipo),
				new HashMap<String, Integer>(tablaDir),
				new HashMap<String, Integer>(nivel),
				new HashMap<String, Integer>(inicio)
				//,new HashMap<String, ObjTipo>(tipo)
				);
		tSimb.tablaTipo.remove(lex);
		tSimb.tablaDir.remove(lex);
		
		tSimb.nivel.remove(lex);
		tSimb.inicio.remove(lex);
		//tSimb.tipo.remove(lex);
		
		return tSimb;
	}

	//modificado para saber que esta en todos los hashmap
	public boolean estaEn(String lex) {
		return tablaTipo.containsKey(lex) && tablaDir.containsKey(lex) && nivel.containsKey(lex) && inicio.containsKey(lex); //&& tipo.containsKey(lex);
	}

	public ObjTipo tablaTipoDe(String lex) {
		return tablaTipo.get(lex);
	}

	public int dirDe(String lex) {
		return tablaDir.get(lex);
	}

	// nuevo para el objeto nivel
	public int nivel(String lex){
		return nivel.get(lex);
	}
	
	// nuevo para el objeto inicio
	public int inicioDe(String lex){
		return inicio.get(lex);
	}
	
	// nuevo para el objeto tipo
	public ObjTipo tipoDe(String lex){
		return tablaTipo.get(lex);
	}
	
	// adaptado
	public String toString() {
		return tablaTipo.toString() + tablaDir.toString() + nivel.toString() +  inicio.toString(); //+ tipo.toString();
	}
	
	/*public void setDir(int dir) {
		this.dir = dir;
	}

	public ObjTipo getObjTipo() {
		return tipo;
	}

	public void setObjTipo(ObjTipo expTipo) {
		this.tipo = expTipo;
	}

	public String dameClase() {
		return clase;
	}
	
	public int dameDir() {
		return dir;
	}

	public int getNivel() {
		return nivel;
	}

	public void setNivel(int nivel) {
		this.nivel = nivel;
	}

	public int getInicio() {
		return inicio;
	}

	public void setInicio(int inicio) {
		this.inicio = inicio;
	}*/
}
